/*
  동등 연산자 == : 자동으로 타입을 변경하여 비교. 타입이 트린변수를 비교하여도 런타임 에러가 발생하지 않음.
alert(1==true); // true

*/

/*
일치연산자 === : 타입과 값이 정확히 일치하는지 / 타입이 틀린 변수를 비교하여도 런타임 에러가 발생하지 않는다
alert(1===true); // false

*NaN : 둘중 하나의 값이 NaN 이면 무조건  false. / 둘다 NaN이어도  false. 어떤값이 NaN인지 확인하려면 isNaN()을 사용.
*alert(NaN==NaN); false alert(isNaN(NaN));
*null, undefined - 두 값이 모두 NULL 이거나 undefined 이면 true .
*/
/*in연산자 객체의 프로퍼티가 존재 하는지 여부를 */
var obj = {x:'ccc',y:2}
console.log('x' in obj); //true  (스트링으로 비교한다)
for(var xx in obj){
	console.log('aaa:'+obj[xx]);
}


var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.setAttribute("type","text/javascript");
script.setAttribute("src", "add.js");
//head.appendChild(script);

var abc = 1; //전역으로 사용한 변수는 브라우저의 내장 전역 객체인 window 의 프로퍼티
var ccc = function(){alert('ccc');}
//alert(window.ccc);



/*Java 와는 달리 블록 단위의 유효 범위는 없다.함수 안에 어디선가 선언된 변수는 블록에 관계없이 접근이 가능하다*/
var abc = 1; //전역변수
var somefunc = function(){
	for(var i=0;i<10;i++){
		if(i==1){
			var j = 1;
			break;
		}
	}
	console.log(j);
	console.log("abc 1: "+abc); //1이 아니라  undefined - 초기화 되지 않은 지역변수로 인식한다.
	var abc =2; //지역변수 
	//abc=2 //전역변수 선언시 이미 전역변수로 선언된  abc의 1의 값이 전달되어 위 첫번째 abc 의 초기화된값 1로 출력된다.
	
	console.log("abc 2: "+abc); //2
	
}
somefunc();



/*
var obj = new Object(); // object
switch(obj){
	case obj:console.log("obj");
	case 'string':console.log("string");

}

var abc = 'abc';
switch(abc){
	case 'abc':console.log("abc");
	case '111':console.log("111");
}

var sum=0;.
for( var i=0,j=10; i<10;i++,j--){
	console.log( i, j, sum += i * j);
}
*/

var cc = function(){
		var o = {
			v:3,
			m: function(){
				var copy_m= function(){/* <--중첩함수 */
				console.log(this); /*현재 this는 window객체를 가리킨다 */
				console.log(this.v); //undefined - window객체에는 v프로퍼티가 없기때문에 결과는  undefined로 나옴.
				}
				copy_m();
			},
			c:this.v
		}
		o.m();
		console.log(o.c); //undefined - 'o' Object에 'c' 프러퍼티의 this.v는 행위가 끝나고 난 뒤에 출력이 가능하나 v프로퍼티의 선언과 동신에 불러오고 있기때문이다. 
		//실행순서 o 프로퍼티 처리 -> 각 내부 function처리. 따라서 내부에 this.v는 3을 정상출력한다.
		
}	
cc();

/*결론 - 
객체에 직접적인 프로퍼티로 할당된 함수 안에서의 this 키워드 만이 그 객체를 가리킨다.

메서드안에서의 this 는 오직 그 함수가 포함된 객체만을 가리킨다.
*/

/********객체 SCOPE 변경(this 가 가리키는 객체를 변경하여 호출하는 방법)***********/
//console.clear();
function m(x,y,z){
	console.log(this,x,y,z); /*this는 원래는 window객체이나, call이나 apply 메서드를 통해 obj객체를 바라볼수있게 강제 변경된다.*/
}
var obj = {val:'call'}
m();
m.call(obj,1,2,7); 
m.apply(obj, [1,2,5] );
/*- 실행함수명.call(전달할 객체, 전달인자, , .. )- 실행함수명.apply(전달할 객체, 배열)*/


/************프로토타입 (prototype*****************/
/*프로토타입은 한 클래스(함수)에 속하는 객체들이 공유하게끔 만들어진 프로퍼티 객체 이다.
아래의 형태로 프로토타입의 메서드나 
프로퍼티를 설정하면 Rectangle로 생성된 각각의 인스턴스들이 공유하여 사용할 수 있다.*/

function Rectangle(w,h){
	this.width = w;
	this.height = h;
}

Rectangle.prototype ={
		name:'TTT',
		v:function(){
			console.log(this.width);
			console.log(this.name);
		}

}
var rect1 = new Rectangle(3,4);
rect1.v();
console.log(Rectangle.prototype.constructor);

function Andwise() {  
	this.title = 'andwise';
}// constructor는 Andwise() 라는 생성자 함수를 가리킨다.console.log(Andwise.prototype.constructor);
console.log( "constructor: "+Andwise.prototype.constructor);
//The constructor property is a reference to the function that created an object. 객체의 생성자로 사용되는 함수에 대한 참조 값
var test = new Date();                                                                                                                                                                                                      
console.log(test.constructor === Date);
console.log(test instanceof Date ); //객체가 속한 클래스와 상위 클래스의 정보를 가져옴. 좌변의 피 연산자가 우변 클래의 인스턴스 인지를 확인한다Java와 마찬가지로 형검사를 수행한다
/*typeof - 결과스트링 : ‘number’, ‘string’, ‘boolean’, ‘object’, ‘undefined’
console.log(typeof(NaN)); //number
console.log(typeof(null)); //number
*/


//객체 - brace {}
//ex)var andwise ={name:'andwise', <--오류의 주범}  이클립스에서 search 시 정규표현식 검색으로  찾는 방법이:   ,[ \t\r\n]*[\}\]]|,[ \t]*//.*[ \t\r\n]*[\}\]]


/*인스턴스를 만들어 클래스를 만들어보자.*/
var obj = function(){
    this.a=1
}

var aa = new obj(); //객체생성.
//console.log(aa.a);

var obj = {
a:3,
c:333
}
console.log(obj.c);


